package com.hb.config;

import com.hb.aspect.EncoreableIntroducer;
import com.hb.impl.DefaultEncoreable;
import com.hb.interfaces.Encoreable;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;

@Configuration
@EnableAspectJAutoProxy
public class EncoreableConfig {
    @Bean
    public Encoreable encoreable() {
        return new DefaultEncoreable();
    }

    // 通过编写切面，为被通知的对象引入新的功能。利用 AOP 的引入，切面可以为 Spring bean 添加新方法。在 Spring 中，切面只是实现了它们所包装 bean 相同接口的
    // 代理。如果除了实现这些接口，代理也能暴露新接口的话，会怎么样呢？那样的话，切面所通知的 bean 看起来像是实现了新的接口，即便底层实现类并没有实现这些接口也无所谓。
    // 我们需要注意的是，当引入接口的方法被调用时，代理会把此调用委托给实现了新接口的某个其他对象。实际上，一个 bean 的实现被拆分到了多个类中。
    @Bean
    public EncoreableIntroducer encoreableIntroducer() {
        return new EncoreableIntroducer();
    }
}
